import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { Message } from 'element-ui'
const service = axios.create({
  // process.env 是nodejs内置的固定环境变量对象
  // npm run dev ->启动开发服务，项目根目录.env.development环境变量配置文件里值添加到process.env对象上
  // npm run build:prod ->启动打包，项目根目录 .env.production环境变量配置文件里添加到process.env对象上
  // 问题:为何不直接写在这里?
  // 答案:开发的时候，用的是基地址1上线的时候，用的是基地址2
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 5000
})

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    // 统一携带token
    const token = store.getters.token
    if (token && config.headers['Authorization'] === undefined) {
      config.headers['Authorization'] = `Bearer ${token}`
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  // eslint-disable-next-line
  async (response) => {
    const { success, message } = await response.data
    if (success) {
      // 如果登录成功，响应数据
      Message.success(message)
      return response.data
    } else {
      // 登录失败，返回一个promise的拒绝状态（await无法接受，可以用try+catch接收）
      // 逻辑失败(把后台返回message提示文字返回到逻辑页面)
      Message.error(message)
      return Promise.reject(message)
    }
  },
  (error) => {
    // 4xx/5xx的响应状态，如果后台返回了响应数据，我们就用一下，如果没有，就error对象本身message值
    Message.error(
      (error.response && error.response.data && error.response.data.message) || error.message
    )
    if (error.response.status === 401) {
      // 1.清除vuex里的token
      // 2.清除本地token
      store.dispatch('user/logoutAction')
      // 3.重新登录,token已经被清除,所以路由前置守卫会进入没有token的那个分支
      router.replace(`/login?redirect=${router.currentRoute.fullPath}`)
    }
    return Promise.reject(error)
  }
)

export default service
